/**
 * 天地图工具
 */
class CesiumTdt {
  viewer: any;
  token: any;
  tdtUrl: any;
  subdomains: any;
  constructor(viewer: any) {
    this.viewer = viewer;
    this.token = "5d638a4a95f764eceadcfbe938cc9455";
    this.tdtUrl = "https://t{s}.tianditu.gov.cn/";
    this.subdomains = ["0", "1", "2", "3", "4", "5", "6", "7"];
  }
  // 叠加影像服务
  add_imgMap() {
    var imgMap = new Cesium.UrlTemplateImageryProvider({
      url: this.tdtUrl + "DataServer?T=img_w&x={x}&y={y}&l={z}&tk=" + this.token,
      subdomains: this.subdomains,
      tilingScheme: new Cesium.WebMercatorTilingScheme(),
      maximumLevel: 18,
    });
    this.viewer.imageryLayers.addImageryProvider(imgMap);
  }

  // 叠加国界服务
  add_iboMap() {
    var iboMap = new Cesium.UrlTemplateImageryProvider({
      url: this.tdtUrl + "DataServer?T=ibo_w&x={x}&y={y}&l={z}&tk=" + this.token,
      subdomains: this.subdomains,
      tilingScheme: new Cesium.WebMercatorTilingScheme(),
      maximumLevel: 10,
    });
    this.viewer.imageryLayers.addImageryProvider(iboMap);
  };

  // 叠加地形服务
  add_terrain() {
    var terrainUrls = new Array();

    for (var i = 0; i < this.subdomains.length; i++) {
      var url = this.tdtUrl.replace("{s}", this.subdomains[i]) + "mapservice/swdx?tk=" + this.token;
      terrainUrls.push(url);
    }

    var provider = new Cesium.GeoTerrainProvider({
      urls: terrainUrls,
    });

    this.viewer.terrainProvider = provider;
  };
  // 叠加三维地名
  add_wtfs() {
    var wtfs = new Cesium.GeoWTFS({
      viewer: this.viewer,
      subdomains: this.subdomains,
      metadata: {
        boundBox: {
          minX: -180,
          minY: -90,
          maxX: 180,
          maxY: 90,
        },
        minLevel: 1,
        maxLevel: 20,
      },
      aotuCollide: true, //是否开启避让
      collisionPadding: [5, 10, 8, 5], //开启避让时，标注碰撞增加内边距，上、右、下、左
      serverFirstStyle: true, //服务端样式优先
      labelGraphics: {
        font: "28px sans-serif",
        fontSize: 28,
        fillColor: Cesium.Color.WHITE,
        scale: 0.5,
        outlineColor: Cesium.Color.BLACK,
        outlineWidth: 5,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE,
        showBackground: false,
        backgroundColor: Cesium.Color.RED,
        backgroundPadding: new Cesium.Cartesian2(10, 10),
        horizontalOrigin: Cesium.HorizontalOrigin.MIDDLE,
        verticalOrigin: Cesium.VerticalOrigin.TOP,
        eyeOffset: Cesium.Cartesian3.ZERO,
        pixelOffset: new Cesium.Cartesian2(0, 8),
      },
      billboardGraphics: {
        horizontalOrigin: Cesium.HorizontalOrigin.CENTER,
        verticalOrigin: Cesium.VerticalOrigin.CENTER,
        eyeOffset: Cesium.Cartesian3.ZERO,
        pixelOffset: Cesium.Cartesian2.ZERO,
        alignedAxis: Cesium.Cartesian3.ZERO,
        color: Cesium.Color.WHITE,
        rotation: 0,
        scale: 1,
        width: 18,
        height: 18,
      },
    });

    //三维地名服务，使用wtfs服务
    wtfs.getTileUrl = () => {
      return this.tdtUrl + "mapservice/GetTiles?lxys={z},{x},{y}&tk=" + this.token;
    };
    // 三维图标服务
    wtfs.getIcoUrl = () => {
      return this.tdtUrl + 'mapservice/GetIcon?id={id}&tk='+ this.token;
    }

    wtfs.initTDT([
      {
        x: 6,
        y: 1,
        level: 2,
        boundBox: { minX: 90, minY: 0, maxX: 135, maxY: 45 },
      },
      {
        x: 7,
        y: 1,
        level: 2,
        boundBox: { minX: 135, minY: 0, maxX: 180, maxY: 45 },
      },
      {
        x: 6,
        y: 0,
        level: 2,
        boundBox: { minX: 90, minY: 45, maxX: 135, maxY: 90 },
      },
      {
        x: 7,
        y: 0,
        level: 2,
        boundBox: { minX: 135, minY: 45, maxX: 180, maxY: 90 },
      },
      {
        x: 5,
        y: 1,
        level: 2,
        boundBox: { minX: 45, minY: 0, maxX: 90, maxY: 45 },
      },
      {
        x: 4,
        y: 1,
        level: 2,
        boundBox: { minX: 0, minY: 0, maxX: 45, maxY: 45 },
      },
      {
        x: 5,
        y: 0,
        level: 2,
        boundBox: { minX: 45, minY: 45, maxX: 90, maxY: 90 },
      },
      {
        x: 4,
        y: 0,
        level: 2,
        boundBox: { minX: 0, minY: 45, maxX: 45, maxY: 90 },
      },
      {
        x: 6,
        y: 2,
        level: 2,
        boundBox: { minX: 90, minY: -45, maxX: 135, maxY: 0 },
      },
      {
        x: 6,
        y: 3,
        level: 2,
        boundBox: { minX: 90, minY: -90, maxX: 135, maxY: -45 },
      },
      {
        x: 7,
        y: 2,
        level: 2,
        boundBox: { minX: 135, minY: -45, maxX: 180, maxY: 0 },
      },
      {
        x: 5,
        y: 2,
        level: 2,
        boundBox: { minX: 45, minY: -45, maxX: 90, maxY: 0 },
      },
      {
        x: 4,
        y: 2,
        level: 2,
        boundBox: { minX: 0, minY: -45, maxX: 45, maxY: 0 },
      },
      {
        x: 3,
        y: 1,
        level: 2,
        boundBox: { minX: -45, minY: 0, maxX: 0, maxY: 45 },
      },
      {
        x: 3,
        y: 0,
        level: 2,
        boundBox: { minX: -45, minY: 45, maxX: 0, maxY: 90 },
      },
      {
        x: 2,
        y: 0,
        level: 2,
        boundBox: { minX: -90, minY: 45, maxX: -45, maxY: 90 },
      },
      {
        x: 0,
        y: 1,
        level: 2,
        boundBox: { minX: -180, minY: 0, maxX: -135, maxY: 45 },
      },
      {
        x: 1,
        y: 0,
        level: 2,
        boundBox: { minX: -135, minY: 45, maxX: -90, maxY: 90 },
      },
      {
        x: 0,
        y: 0,
        level: 2,
        boundBox: { minX: -180, minY: 45, maxX: -135, maxY: 90 },
      },
    ]);

    // 关闭地形深度检测
    this.viewer.scene.globe.depthTestAgainstTerrain = false;
    
    // 字体透明度设置。但注意这是在加完之后才能设置，没有找到加载完的回调loaded方式。刚加载时wtfs.labelCache是空数组
    // wtfs.labelCache.forEach(entity => {
    //   entity.label.fillColor = entity.label.fillColor.getValue().withAlpha(alpha/100);
    //   entity.label.outlineColor = entity.label.outlineColor.getValue().withAlpha(alpha/100);
    // });
  }
  init() {
    this.add_imgMap();
    this.add_iboMap();
    this.add_terrain();
    this.add_wtfs();
  }
}
export default CesiumTdt;
